﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
using Crosland.Automotriz.Data.Dao.Linq;
using System.Data.SqlClient;
using Crosland.Automotriz.Logic.ControlExeption;
using System.Data;
namespace Crosland.Automotriz.Logic.Linq
{
    public class clsImportacionesLogic
    {

        clsLogImportacionesDAO datosCab = new clsLogImportacionesDAO();
        clsLog_Importaciones_DetDAOcs datosDet = new clsLog_Importaciones_DetDAOcs();
        clsT_Imp_Importaciones_Doc_RelacionadosDAO datosDoc = new clsT_Imp_Importaciones_Doc_RelacionadosDAO();

        public bool Insertar(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Objdet)
                {
                    Obj.T_IMP_IMPORTACION_DET.Add(d);
                    
                }
                return datosCab.Insertar(Obj);
            }
            catch
            {
                return false;
            }
        }

        public bool Modificar(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Objdet)
                {
                    datosDet.Insertar(d);
                }
                return datosCab.Modificar(Obj);
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool Insertar(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet, List<T_IMP_IMPORTACIONES_DOC_RELACIONADOS> ObjDoc)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Objdet)
                {
                    Obj.T_IMP_IMPORTACION_DET.Add(d);
                }

                if (!datosCab.Insertar(Obj)) return false;

                foreach (T_IMP_IMPORTACIONES_DOC_RELACIONADOS doc in ObjDoc)
                {
                    datosDoc.Insertar(doc);
                }

                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool VerificarNumeroPedido(string numPedido)
        {
            return datosCab.VerificarNumeroPedido(numPedido);
        }



        public bool InsertarDocumentos(List<T_IMP_IMPORTACIONES_DOC_RELACIONADOS> ObjDoc)
        {
            try
            {             

                foreach (T_IMP_IMPORTACIONES_DOC_RELACIONADOS doc in ObjDoc)
                {
                    datosDoc.Insertar(doc);
                }

                return true;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        public bool InsertarBackOrder(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Objdet)
                {
                    Obj.T_IMP_IMPORTACION_DET.Add(d);
                }
                datosCab.InsertarBackOrder(Obj);
                return true;
            }
            catch (EntityException ex)
            {
                throw new Automotriz.Logic.ControlExeption.DataException("Error en la inserción", ex);
            }
            catch (System.Data.DataException ex) {
                throw new Automotriz.Logic.ControlExeption.DataException("Error en la inserción", ex);            
            }
            catch (Exception ex)
            {
                throw new Automotriz.Logic.ControlExeption.RunException("Error en la aplicación", ex);
            }
        }









        public bool Modificar(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet, List<T_IMP_IMPORTACIONES_DOC_RELACIONADOS> ObjDoc)
        {
            if (!datosCab.Modificar2(Obj)) return false;
            if (!datosDet.Insertar2(Objdet)) return false;
            foreach (T_IMP_IMPORTACIONES_DOC_RELACIONADOS doc in ObjDoc)
            {
                if (!datosDoc.Insertar(doc))
                {
                    return false;
                }
            }
            //if (!datosDoc.Insertar2(ObjDoc)) return false;

            return true;
        }

        public bool Modificar_2013_09_06(T_IMP_IMPORTACION_CAB Obj, List<T_IMP_IMPORTACION_DET> Objdet, List<T_IMP_IMPORTACIONES_DOC_RELACIONADOS> ObjDoc)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Objdet)
                {
                    datosDet.Insertar(d);
                }
                foreach (T_IMP_IMPORTACIONES_DOC_RELACIONADOS doc in ObjDoc)
                {
                    datosDoc.Insertar(doc);
                }
                return datosCab.Modificar2(Obj);
            }
            catch (Exception)
            {
                return false;
            }
        }

        //modificar cabecera y detalle
        public bool InsertarDetalle(int ID_IMP_IMPORTACION_CAB, int ID_ORG_VTA, string NUM_PEDIDO, string COD_TIPO_PEDIDO, int NUM_ITEM_PED, int ID_MATERIAL, string COD_MATERIAL, string DES_MATERIAL_IMP, string CAJA, decimal CANT_IMP, decimal FOB_ME, decimal TOTAL_FOB_ME, int ID_PRONOSTICO_TIPO)
        {
            try
            {
                return datosDet.InsertarDetalle(ID_IMP_IMPORTACION_CAB, ID_ORG_VTA, NUM_PEDIDO, COD_TIPO_PEDIDO, NUM_ITEM_PED, ID_MATERIAL, COD_MATERIAL, DES_MATERIAL_IMP, CAJA, CANT_IMP, FOB_ME, TOTAL_FOB_ME, ID_PRONOSTICO_TIPO);
            }
            catch(Exception ex)
            {
                throw ex;
            }

        }

        public bool InsertarDetalleImportacion(T_IMP_IMPORTACION_DET Obj)
        {
            try
            {
                return datosDet.Insertar(Obj);
            }

            catch
            {
                return false;
            }
        }

        public bool Modicar(T_IMP_IMPORTACION_CAB Objdet)
        {

            return datosCab.Modificar(Objdet);
        }

        public bool ModicarDet(T_IMP_IMPORTACION_DET Objdet)
        {
            return datosDet.Modificar(Objdet);
        }

        public List<T_IMP_IMPORTACION_CAB> listarCab()
        {
            return datosCab.listar();
        }

        public List<IMPORTACION_CAB> listarCab(int idCab)
        {
            return new clsLogImportacionesDAO().listar(idCab);
        }

        public List<T_IMP_IMPORTACION_DET> listarDet()
        {
            return datosDet.listar();
        }

        public List<IMPORTACION_DET> listarDet(String strNumPedido)
        {
            return new clsLog_Importaciones_DetDAOcs().listar(strNumPedido);
        }

        public List<IMPORTACION_DET> listarDet(int idCab, String strCodTipoPedido)
        {
            return new clsLog_Importaciones_DetDAOcs().listar(idCab, strCodTipoPedido);
        }

        public IEnumerable<Object> ImportacionCAB(int Anio_ini,int anio_fin, string indicador, int id_org_vta)
        {
            try
            {

                if (datosCab.ImportacionCAB(Anio_ini, anio_fin, indicador, id_org_vta) == null)
                {
                    throw new Automotriz.Logic.ControlExeption.DataException("No hay datos con los filtros enviados");
                }
                return datosCab.ImportacionCAB(Anio_ini, anio_fin, indicador, id_org_vta);

            }
          
            catch (Exception e) {

                throw new Automotriz.Logic.ControlExeption.RunException("Error en la aplicación al Listar datos de importación  ",e);
            }

           
        
        
        }

        public IEnumerable<Object> ImportacionDET(int ID_IMP_CAB)
        {
            return datosDet.ImportacionDET(ID_IMP_CAB);
        }

        public bool ModificarCAB(string num_ped, string fe_embarque, string fe_embarque_Est, string fe_Puerto, string fe_Puerto_Est, string observ, string cod_imp_estado, int id_tipo_transporte, string num_pedido_orig)
        {
            return datosCab.ModificaCab(num_ped, fe_embarque, fe_embarque_Est, fe_Puerto, fe_Puerto_Est, observ, cod_imp_estado, id_tipo_transporte, num_pedido_orig);
        }

        public bool Anular_importacion(int idCab)
        {
            return datosCab.Anular_importacion(idCab);
        }

        public List<T_IMP_IMPORTACION_DET> BusquedaImportacionDet(int idCab)
        {
            List<T_IMP_IMPORTACION_DET> lista = new List<T_IMP_IMPORTACION_DET>();
            try
            {
                var q = from l in datosDet.listar()
                        //where l.NUM_PEDIDO == num_pedido
                        where l.ID_IMP_IMPORTACION_CAB==idCab
                        //where l.ID_MATERIAL == null
                        select l;
                return lista = q.ToList();
            }
            catch
            {
                lista = null;
            }
            return lista;
        }

        public List<T_IMP_IMPORTACION_DET> filtroImporDet(string num_pedido, string cod_tipo_pedido)
        {
            return datosDet.listarFiltroDetalle(num_pedido, cod_tipo_pedido);
        }

        public Boolean verificarCodTipoPedido(int idCab, String strCodTipoPedido)
        {
            return new clsLog_Importaciones_DetDAOcs().verificarCodTipoPedido(idCab, strCodTipoPedido);
        }

        public bool PA_ELIMINAR_LOG(string num_pedido)
        {
            return datosDet.PA_ELIMINAR_LOG(num_pedido);
        }

        public bool EliminarDetalle(int ID_IMP_IMPORTACION_CAB, string cod_titpo_pedido)
        {
            return datosDet.EliminarDetalle(ID_IMP_IMPORTACION_CAB, cod_titpo_pedido);
        }

        public int listarNumeroPedido(int idCab)
        {
            return datosCab.listarNumeroPedido(idCab);
        }

        public int RetorFunctionNumMes(string ini, string fin)
        {
            return datosCab.RetorFunctionNumMes(ini, fin);
        }

        public IEnumerable<Object> ListaTipoTranspote()
        {
            return datosCab.ListaTipoTranspote();
        }

        public int RetorIDTipoPronostico(string des_corta)
        {
            return datosDet.RetorIDTipoPronostico(des_corta);
        }

        public int RetorIDMaterial(string COD_MATERIAL)
        {
            return datosDet.RetorIDMaterial(COD_MATERIAL);
        }

        public int RetorIDMaterialKawasaki(string COD_MATERIAL)
        {
            return datosDet.RetorIDMaterialKawasaki(COD_MATERIAL);
        }
        public bool InsertarArticulosExcel(int nro_pronostico, int id_material, decimal cant_sug_real, decimal cant_sug, decimal fob_me, int id_pronostico_tipo,String tipo_abc,String tipo_abc_can)
        {
            try
            {
                return datosDet.InsertarArticulosExcel(nro_pronostico, id_material, cant_sug_real, cant_sug, fob_me, id_pronostico_tipo, tipo_abc, tipo_abc_can);
        
            }
            catch (SqlException sqlEx)
            {
                throw new System.Data.DataException("Error al guardar datos en la TH_PRONOSTICO_IMP_DET",sqlEx);
            }
            catch (Exception ex)
            {
                throw new RunException("Error en la aplicación ",ex);
            }
          
        }

        public int UltimoPedidoGenerado()
        {
            return datosCab.UltimoPedidoGenerado();
        }

        public int Verificacion(int nro_pronostico,int id_material) {
            return datosDet.Verificacion(nro_pronostico,id_material);
        
        }


        public List<T_IMP_IMPORTACION_DET> ListaBackOder(String num_pedido)
        {
            return datosCab.ListaBackOder(num_pedido);
        }



        public List<T_IMP_IMPORTACION_DET> ListBackOrderxMaterial(String num_pedido, String cod_tipo_pedido, int id_material)
        {
            return datosCab.ListBackOrderxMaterial(num_pedido,cod_tipo_pedido,id_material);

        }


        public bool InsertarImportacionCab(int id_org_vta, String num_pedido, String num_pedido_org, int id_ofi_vta, String cod_imp_estado,String fecha_llegada_puerto,int id_proveedor) {

            return datosDet.InsertarImportacionCab( id_org_vta,  num_pedido,  num_pedido_org,  id_ofi_vta,  cod_imp_estado,fecha_llegada_puerto,id_proveedor);
        }

        public int RetornarUltimoNumeroImpCab() {
            return datosDet.RetornarUltimoNumeroImpCab();
        }

        public bool EliminarDetCab(string num_pedido)
        {
            return datosDet.EliminarDetCab(num_pedido);
        }




        public bool GeneraBackOrder(String num_pedido_org)
        {
            return datosCab.GeneraBackOrder(num_pedido_org);
        
        }



        public bool USP_TD_FOB_ACTUALIZA_PRECIO_FOB()
        {

            try
            {
                return datosDet.USP_TD_FOB_ACTUALIZA_PRECIO_FOB();
            }
            catch (SqlException ex)
            {

                throw new Automotriz.Logic.ControlExeption.DataException("Error en la aplicación", ex);
            }
            catch (Exception ex) {

                throw new Automotriz.Logic.ControlExeption.RunException("Error en la aplicación", ex);
            
            }
        }




        public bool USP_T_IMP_IMPORTACION_DET_ACTUALIZA_FOB(int ID_IMP_IMPORTACION_CAB)
        {

            try
            {
                return datosDet.USP_T_IMP_IMPORTACION_DET_ACTUALIZA_FOB(ID_IMP_IMPORTACION_CAB);
            }
            catch (SqlException ex)
            {

                throw new Automotriz.Logic.ControlExeption.DataException("Error en la aplicación", ex);
            }
            catch (Exception ex)
            {

                throw new Automotriz.Logic.ControlExeption.RunException("Error en la aplicación", ex);

            }
        }



    }
}
